/**
 * Sequence
 *
 * An ASN1 type for a Sequence, implemented as an Array
 * Copyright (c) 2007 Henri Torgemane
 *
 * See LICENSE.txt for full license information.
 */
package com.hurlant.util.der
{
	import flash.utils.ByteArray;

	public dynamic class Sequence extends Array implements IAsn1Type
	{
		protected var type:uint;
		protected var len:uint;

		public function Sequence(type:uint=0x30, length:uint=0x00)
		{
			this.type=type;
			this.len=length;
		}

		public function getLength():uint
		{
			return len;
		}

		public function getType():uint
		{
			return type;
		}

		public function toDER():ByteArray
		{
			var tmp:ByteArray=new ByteArray;
			for (var i:int=0; i < length; i++)
			{
				var e:IAsn1Type=this[i];
				if (e == null)
				{ // XXX Arguably, I could have a der.Null class instead
					tmp.writeByte(0x05);
					tmp.writeByte(0x00);
				}
				else
				{
					tmp.writeBytes(e.toDER());
				}
			}
			return DER.wrapDER(type, tmp);
		}

		public function toString():String
		{
			var s:String=DER.indent;
			DER.indent+="    ";
			var t:String="";
			for (var i:int=0; i < length; i++)
			{
				if (this[i] == null)
					continue;
				var found:Boolean=false;
				for (var key:String in this)
				{
					if ((i.toString() != key) && this[i] == this[key])
					{
						t+=key + ": " + this[i] + "\n";
						found=true;
						break;
					}
				}
				if (!found)
					t+=this[i] + "\n";
			}
//			var t:String = join("\n");
			DER.indent=s;
			return DER.indent + "Sequence[" + type + "][" + len + "][\n" + t + "\n" + s + "]";
		}

		/////////

		public function findAttributeValue(oid:String):IAsn1Type
		{
			for each (var set:* in this)
			{
				if (set is Set)
				{
					var child:*=set[0];
					if (child is Sequence)
					{
						var tmp:*=child[0];
						if (tmp is ObjectIdentifier)
						{
							var id:ObjectIdentifier=tmp as ObjectIdentifier;
							if (id.toString() == oid)
							{
								return child[1] as IAsn1Type;
							}
						}
					}
				}
			}
			return null;
		}


	}
}

